iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
自我挑戰組

初入Swift新手村的旅程系列 第 15

Day15 Swift 閉包 Closures

  • 分享至 

  • xImage
  •  

閉包

閉包是包含在函數的程式碼,可以在程式碼中被傳遞和使用,也被稱為匿名函數。

{ (parameters) -> return type in
	statements
}
// 這個函數式計算某個整數的平方
func myFunc(param: Int) -> Int {
	return param * param
}
// 閉包的建立方式
let myClosures = {(param: Int) -> Int in
	return param * param
}

閉包在語法上,由in關鍵字來進行分割

// 對函數進行呼叫,返回9
myFunc(param: 3)
// 對閉包進行呼叫,返回9
myClosures(3)

與函數不同的是,閉包的返回值是可以省略的。

// 閉包的建立方式
let myClosures1 = {(param: Int) in
	return param * param
}

根據上下文推測型別

通過內聯閉包運算式所構造的閉包作為參數傳遞給函數時,都可以推測出閉包的參數和返回值的型別,所以就可以拿掉「小括號」和「參數型別」。

尾隨閉包

假設開發時需要將一個很長的閉包作為參數傳遞給函數,可以利用尾隨閉包,來讓提升整體程式碼的可讀性。

// 原結構
mySort(array: &stuArr, sortClosure: {
	($0 as! Student).achievement > ($1 as! Student).achievement
})
// 尾隨閉包
mySort(array: &stuArr){
	($0 as! Student).achievement > ($1 as! Student).achievement
}

可以在進行簡化

func myFunc(closure:() -> ()) {

}
// 閉包的型別為 () -> () 沒有參數也沒有返回值
// 使用尾隨閉包進行函式呼叫
myFunc() {

}
// 如果函式只有閉包這一個參數時,甚或是可以將函式的()省略,修改如下:
myFunc {

}

逃逸閉包

在一般情況下,函數參數中的閉包都為非逃逸閉包,但開發者可以根據實際需求將閉包參數,宣告為逃逸閉包。逃逸閉包指的是當一個閉包作為參數傳到一個參數中,但是這個閉包在函數返回之後才被執行,我們就稱閉包從函數中逃逸,開發者可以在參數前標示@escaping用來表示這個閉包是被允許逃逸出這個函數的。

var closures1: [() -> Void] = []
func escapingFunc(clousures: @escaping () -> Void) {
	closures1.append(clousures)
}

自動閉包

不是每個閉包都需要顯式建立的,Swift中還有一種叫做自動閉包,但自動閉包的參數有嚴格的條件,首先此閉包不能有參數,其次在調用函數傳參數時,只能用一句來組成,自動閉包的參數由@autoclosure來宣告。

// 宣告為自動閉包
func myFunc(clousure: @autoclosure () -> Bool) {

}
// 呼叫傳入一個表達式
myFunc(clousure: 1+2+3>10)
// 將閉包宣告為自動閉包與逃逸閉包
func myFunc(clousure: @autoclosure @escaping ()->Bool) {

}

接下來,是列舉的介紹


上一篇
Day14 Swift 函數 Function - 2
下一篇
Day16 Swift 列舉
系列文
初入Swift新手村的旅程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言